import { ElMessage } from 'element-plus'

/**
 * 本地文件处理服务 - 用于提供文件上传失败时的备用方案
 */
const localFileService = {
  /**
   * 为本地文件创建预览URL
   * @param {File} file - 文件对象
   * @returns {Promise<string>} - 预览URL
   */
  createPreviewUrl(file) {
    return new Promise((resolve, reject) => {
      try {
        // 对于大多数现代浏览器支持的文件类型，使用createObjectURL
        const url = URL.createObjectURL(file)
        resolve(url)
      } catch (error) {
        console.error('创建预览URL失败:', error)
        reject(new Error('无法创建文件预览'))
      }
    })
  },

  /**
   * 读取文本文件内容
   * @param {File} file - 文件对象
   * @returns {Promise<string>} - 文件内容
   */
  readTextContent(file) {
    return new Promise((resolve, reject) => {
      const reader = new FileReader()
      
      reader.onload = (e) => {
        resolve(e.target.result || '')
      }
      
      reader.onerror = (error) => {
        console.error('读取文件内容失败:', error)
        reject(new Error('读取文件内容失败'))
      }
      
      reader.readAsText(file)
    })
  },

  /**
   * 读取图片文件内容
   * @param {File} file - 文件对象
   * @returns {Promise<string>} - 图片数据URL
   */
  readImageContent(file) {
    return new Promise((resolve, reject) => {
      const reader = new FileReader()
      
      reader.onload = (e) => {
        resolve(e.target.result)
      }
      
      reader.onerror = (error) => {
        console.error('读取图片内容失败:', error)
        reject(new Error('读取图片内容失败'))
      }
      
      reader.readAsDataURL(file)
    })
  },

  /**
   * 下载本地文件
   * @param {File} file - 文件对象
   * @param {string} filename - 下载的文件名
   */
  downloadLocalFile(file, filename) {
    try {
      const url = URL.createObjectURL(file)
      const link = document.createElement('a')
      
      link.href = url
      link.download = filename || file.name
      document.body.appendChild(link)
      link.click()
      
      // 清理
      setTimeout(() => {
        document.body.removeChild(link)
        URL.revokeObjectURL(url)
      }, 100)
      
      ElMessage.success(`开始下载文件: ${filename || file.name}`)
    } catch (error) {
      console.error('本地文件下载失败:', error)
      ElMessage.error('文件下载失败')
    }
  },

  /**
   * 判断文件是否可预览
   * @param {File} file - 文件对象
   * @returns {boolean} - 是否可预览
   */
  isPreviewable(file) {
    if (!file || !file.type) return false
    
    // 图片类型
    const imageTypes = ['image/jpeg', 'image/png', 'image/gif', 'image/webp', 'image/bmp', 'image/svg+xml']
    if (imageTypes.includes(file.type)) return true
    
    // 文本类型
    const textTypes = ['text/plain', 'application/json', 'application/javascript', 'text/css', 'text/html']
    if (textTypes.includes(file.type)) return true
    
    // PDF类型
    if (file.type === 'application/pdf') return true
    
    // 视频类型
    const videoTypes = ['video/mp4', 'video/webm', 'video/ogg']
    if (videoTypes.includes(file.type)) return true
    
    // 音频类型
    const audioTypes = ['audio/mpeg', 'audio/wav', 'audio/ogg', 'audio/webm']
    if (audioTypes.includes(file.type)) return true
    
    return false
  },

  /**
   * 获取文件的预览类型
   * @param {File} file - 文件对象
   * @returns {string} - 预览类型
   */
  getPreviewType(file) {
    if (!file || !file.type) return 'unknown'
    
    if (file.type.startsWith('image/')) return 'image'
    if (file.type.startsWith('text/') || file.type === 'application/json' || file.type === 'application/javascript') return 'text'
    if (file.type === 'application/pdf') return 'pdf'
    if (file.type.startsWith('video/')) return 'video'
    if (file.type.startsWith('audio/')) return 'audio'
    
    return 'unknown'
  },

  /**
   * 清理对象URL，避免内存泄漏
   * @param {string} url - 要清理的对象URL
   */
  cleanupObjectUrl(url) {
    if (url && url.startsWith('blob:')) {
      try {
        URL.revokeObjectURL(url)
      } catch (error) {
        console.error('清理对象URL失败:', error)
      }
    }
  }
}

export default localFileService